解析 C++ 20:新特性,它们的用法,和由来。
为什么你要读这个系列的文章
Bjarne Stroustrup(C++ 之父)即将在 HOPL 上发表一篇 paper:Thriving in a crowded and changing world: C++ 2006-2020。
这是 C++ 第三次在 HOPL 这个会议上出现,而 HOPL 会算上 2020 年这一场,才是第四场。看得出来,C++ 在编程语言发展史上举足轻重的地位(说到 HOPL,这其实也是我们“简史”系列提到编程语言的时候一个重要的资料来源)。最近也是 C++20(2020 版本)标准由草案转正式发布的时间点。也有热心的网友(知乎 @d41d8c )翻译了WG21 的变更摘要,可以看到还是有很多核心的改动。
要说起来一般也就 C++ 开发者才会关注这些改动了。实际现状可能更糟糕,再往前推三个版本的 C++11 都还没能够被完全接受。其中有些特性早在 200x 年的时候就已经提出来了,大部分人还是把这一个版本作为“Modern C++”来关注。这一次 BS 在 HOPL 上的亮相,算是把整个语言定个格,把 2006-2020 年的这四个版本算成一个阶段性的改造,这也是我们这系列文章需要重点关注的内容。毕竟,很多语言特性早在那个时代就已经提出,却在 C++20 中才有个定论。比如 Concept,刘未鹏老师就已经在 2007 年讨论过 C++0x 中的 Concept 了。
刚才说的是 C++ 开发者的事儿,那么作为一个外人,你有没有必要了解呢?还是要关注的,我简单提以下三个原因。
C++ 在引领编程语言的发展方向
前面提了,C++ 作为一个举足轻重的编程语言,对于生产和学术界都很重要。也正是它令人纠结地难用以及各种细节问题,这个世界随后产生了很多想要改变 C++ 替代品。有些是碰瓷儿,作为吸引开发者的方式来这样宣传,他们是 better C++,比如 Java / C#(两者都曾经提到过 C++++这种暧昧的字眼),但实际跟 C++的应用领域井水不犯河水;另外一些则是真的遇到了痛点想要尝试做突破,但要么自身问题严重(D / golang),要么就还卡在丰富自身的路上(Rust)。
而表面上看这些后起之秀已经开始这些小动作了,理论上 C++ 的地位应该堪忧才对。但实际并不。C++ 这十几年来的发展也一直在时代的前列腺上。Rust 支持所有权和转移语义的时候,C++11 早就有了智能指针和转移语义了;golang 还在纠结怎么加入泛型的时候,C++已经支持 Concept 了;至于 Swift 这种野路子,你的 variadic type param 实现了吗?
这些现代的编程语言也不过是在步 C++ 的后尘。WG21 的 papers 里面还有一堆的想法,来自一线大厂的开发者们,总想为这门已经无限复杂的编程语言添砖 java,哦不,添砖加瓦。
你现在使用的工具,也许下一个就从 C++ 这里偷师了些什么回来,而等他真的到来的那天,这里的内容也许真的会帮到你的。Java 一直在纠结说要不要实现值语义和 refied generics,这话至少从我听说到现在都已经很多年了(早在 Project Valhalla 是否会放到 Java 9 的时候就在讨论这个问题),而 C++ 本身默认是值语义,并且基于模版的 generics 和 specialization 是远在 ISO C++ 第一版(ISO/IEC 14882:1998)出来的时候就完美支持了的。
C++ 在探索和引导解决工程实践上的问题
再不济我们来看第二个点。前面说过,已经有了一大堆的编程语言是受 C++ 影响和希望改变 C++ 的一部分问题产生的,而这部分语言实际上要解决的问题,也正是在他们感知到以后整个业界其实都在存在的问题。比如 golang 会把除了“编译器”之外的工具链部分也集成起来作为发行版的一份存在;比如至少提供一些比较基础的系统级库而不必每个应用都得自己造一遍跨平台的轮子等等之类。这些问题、解决方案和因此而产生的更多问题,实际是在不断反哺整个 IT 行业,在促进工具和编程语言的提升和变革。不然也就不会存在 Swift 这种几乎每年一个版本,每个版本都大不同的存在了。而,刚好,C++ 在很多情况下都是这些问题的起点和最痛处。了解这些对于你正确认知和处理这些问题,是非常有好处的。
C++ 的整体完备性能够代表绝大多数语言的情况
第三个点之前跟极限编程社区的朋友们也聊过,C++ 的定位是 direct hardware mapping 直接硬件映射 + high level abstraction 高阶抽象,下抵 C,上达 Haskell。跟大部分做应用和业务编程的人常规在使用的编程语言(Java、Ruby、Python 和 PHP)不同,C++ 是能够正确反应你的系统级内容并且允许你进行同样级别的控制的。这其实相当于带来了另外一个处理问题的视角,这个视角也恰好只能是定位比较精神分裂的 C++ 能够做到的:因为除了他之外我还鲜少看到真的做到了能够支持这么多种编程范式并且还同时兼顾了底层的编程语言。买一赠 N,划得来。
以上三点也可以总结为:C++ 代表了先进编程语言的发展方向,C++ 代表了最广大开发者的根本利益,C++ 代表了先进编程语言的发展要求。🐸
说这么多,并非推广 C++ 这个编程语言。这对我没有任何好处。主要是从前面三个点考量,一个能够坚持 30 多年一直在暴露问题、不断提升而且非常强大的编程语言,是非常值得所有人去关注去了解并学习到一些新东西;另外恰好 C++ 自身的特点导致他几乎把计算机科学的每一个领域都沾了一遍,接触到其实不仅仅是多了解一门编程语言,更是能够对整个计算机科学体系认知的一种提升;最后,如果你是一个比较关注编程语言领域的人,真的非常有必要多去看看 WG21 的论文集,那基本就是个宝藏。
是为前言。